package seguranca;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import entidade.LoginUsuario;
import sessao.LoginUsuarioFacade;
import java.io.IOException;
import javax.ejb.EJB;
import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.primefaces.context.RequestContext;

/**
 *
 * @author bruno
 */
@ManagedBean
@SessionScoped
public class Login implements Serializable {

    @EJB
    private LoginUsuarioFacade loginUsuarioFacade;
    private int idLogin;
    private String nomeUtilizador;
    private String senha;
    private boolean debug;
    private LoginUsuario loginUsuario;

    /** Creates a new instance of Login */
    public Login() {
        idLogin = 0;
        nomeUtilizador = "";
        senha = "";
        loginUsuario = null;
        debug = true;
    }

    public int getIdLogin() {
        return idLogin;
    }

    public void setIdLogin(int id) {
        this.idLogin = id;
    }

    public LoginUsuario getLoginUsuario() {
        if (loginUsuario == null) {
            loginUsuario = loginUsuarioFacade.find(idLogin);
        }
        return loginUsuario;
    }

    public String getNomeUtilizador() {
        return nomeUtilizador;
    }

    public void setNomeUtilizador(String nomeUtilizador) {
        this.nomeUtilizador = nomeUtilizador;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public void updateLogin() {
        try {
            loginUsuarioFacade.edit(loginUsuario);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Senha Alterada com Sucesso", null));
        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro operação não concluída", null));
        }
    }
    /*Método de Autenticação de usuarios 
    Em caso de falhar a autenticação regressa ao login 
    Caso Contrario é direccionado a pagina inicial*/

    public String autenticar() {
        UsernamePasswordToken token = new UsernamePasswordToken(nomeUtilizador, senha);

        try {
            Subject user = SecurityUtils.getSubject();

            if (user.isAuthenticated()) {
                user.logout();
            }

            user.login(token);

            for (LoginUsuario us : loginUsuarioFacade.findAll()) {
                if (us.getSenha().equals(getSenha()) && us.getNomeUsuario().equalsIgnoreCase(getNomeUtilizador())) {
                    idLogin = us.getIdLoginUsuario();
                    if (debug) {
                        System.out.println("\nPROIN INFO:\tSession:"
                                + "\nPROIN INFO:\tID: " + us.getIdLoginUsuario()
                                + "\nPROIN INFO:\tNOME: " + us.getNomeUsuario()
                                + "\nPROIN INFO:\tTIPO: " + us.getFkTipoUsuario().getDesignacao());
                    }
                }
            }

        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                    FacesMessage.SEVERITY_WARN, "Senha ou Nome de Utilizador Errado", null));

            System.err.println("Erro ao logar: \n" + e.getMessage());
            return null;
        }
        return "inicio";
    }

    public boolean temPermissao(String perm) {
        return SecurityUtils.getSubject().isPermitted(perm);
    }
    
    public boolean senhaDefault()
    {
    
        return getLoginUsuario().getSenha().equalsIgnoreCase(nomeUtilizador); 

    }

    /*Método de para terminar a sessão
     * Inicializa o Login */
    public void logout() {
        if (debug) {
            System.out.println("\nPROIN INFO:\t" + this.nomeUtilizador + "\tLogout");
        }

        this.setIdLogin(0);
        this.setNomeUtilizador("");
        this.setSenha("");
        this.loginUsuario = null;
        SecurityUtils.getSubject().logout();
        FacesContext.getCurrentInstance().getExternalContext().invalidateSession();

        try {
            FacesContext.getCurrentInstance().getExternalContext().redirect(
                    FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath() + "/faces/login.xhtml");
        } catch (IOException ex) {
            System.err.println("Erro ao Terminar Sessão");
        }
    }
}
